home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / kerberos / pc / krb_src.lha / KUSER / KERBMEM.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-24  |  4.6 KB  |  198 lines

  1. /***********************************************
  2.     mk_tkt.c    Peter Tan
  3.         used to create the "ticket file" in    RAM.
  4.         sets TKT_ENV env variable to point    
  5.         to the segment where the ticket file exists.
  6.             
  7. ***********************************************/
  8.  
  9. #include <conf.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <dos.h>
  13. #include <stdlib.h>
  14. #include <krb.h>
  15.  
  16. #define TKT_FIL_SZ 64U     /* Number of paragraphs */
  17. #define TKT_FIL_MIN 16U    /* Minimum number of paragraphs */
  18.  
  19. extern char far *nxtevar (char far*vptr);
  20. extern char far *mstenvp (void);
  21. extern int envsiz (char far*envptr);
  22.  
  23. char far *menv;
  24. char far *rest;
  25. char far *lstbyt;
  26. char vname[512], *txtptr;
  27. int free_env,nmlen;
  28. char *progname;
  29.  
  30. void findvar(char *varnam)
  31. {
  32.     nmlen=strlen(varnam);
  33.     txtptr=NULL;
  34.     while (*menv) {
  35.         rest=nxtevar(menv);
  36.         sprintf(vname,"%Fs",menv);
  37.         if (vname[nmlen]=='=') {    /* possible match */
  38.             vname[nmlen]='\0';
  39.             if (stricmp(vname,varnam)==0) {
  40.                 txtptr=&vname[nmlen+1];
  41.                 vname[nmlen]='=';
  42.                 return;        /* found it, leave now */
  43.             }
  44.         }
  45.         menv=rest;    /* try again with next */
  46.     }
  47. }
  48.  
  49. void putenvbak()
  50. {
  51.     char * locptr;
  52.     int i,save_size;
  53.  
  54.     save_size=FP_OFF(lstbyt)-FP_OFF(rest) +1;
  55.     locptr=(char*)malloc(save_size);
  56.     
  57.     for (i=0; i<save_size;i++)    /* save trailing data */
  58.         locptr[i]=rest[i];
  59.     for (i=0; vname[i];i++)        /* copy new env setting */
  60.         *menv++=vname[i];
  61.     if (vname[0])        /* if not deleting */
  62.         *menv++='\0';    /* ... add end of string */
  63.     for (i=0;i<save_size;i++)
  64.         *menv++=locptr[i];
  65.     free(locptr);
  66. }
  67.  
  68. void setvar(char *varnam,char *value)
  69. {
  70.     int i;
  71.     menv=mstenvp();
  72.     free_env=envsiz(menv);
  73.     findvar(varnam);
  74.     for (lstbyt=menv;*lstbyt;)
  75.         lstbyt=nxtevar(lstbyt);    /* find last byte */
  76.     if (lstbyt[1]==1 && lstbyt[2]==0) {
  77.         lstbyt+=3;        /* skip loadfile name */
  78.         while (*lstbyt)
  79.             lstbyt++;
  80.     }
  81.     lstbyt++;
  82.     free_env -= FP_OFF(lstbyt);        /* what's left is free */
  83.     if (txtptr==NULL) { /* Name not found */
  84.         free_env-=nmlen+1;     /* take out free space
  85.         if (free_env < strlen(value)) {
  86.             printf("%s : Not enough environment space",progname);
  87.             exit(1);
  88.         }
  89.         /* add the environment variable */
  90.         for (i=0;i<nmlen;i++)    /* force uppercase */
  91.             vname[i]=(char)toupper(varnam[i]);
  92.         vname[nmlen]='=';
  93.         vname[nmlen+1]='\0';
  94.         txtptr=&vname[nmlen+1];
  95.     }
  96.     if (value)
  97.         strcpy(txtptr,value);
  98.     else
  99.         vname[0]=0;        /* delete this variable */
  100.     putenvbak();
  101. }
  102.  
  103. void remove_memory()
  104. {
  105.     tkt_header far *hdr;
  106.     char *value;
  107.     unsigned segment;
  108.     
  109.     if ((value=getenv(TKT_ENV))==NULL) {
  110.         printf("%s : Ticket memory not reserved\n",progname);
  111.         exit(0);
  112.     }
  113.     sscanf(value,"%u",&segment);
  114.     if (segment==0) {
  115.         printf("%s : Environment variable corrupt\n",progname);
  116.         exit(0); 
  117.     }
  118.     setvar(TKT_ENV,NULL);
  119.     hdr=(char far *)((unsigned long)segment<<16|0UL);
  120. #ifdef __BORLANDC__
  121.     freemem(segment);
  122. #else
  123.     _dos_freemem(segment);
  124. #endif
  125.     printf("%s : Ticket memory freed OK\n",progname);
  126.     exit(0);
  127. }
  128.  
  129. void clear_sema()
  130. {
  131.     tkt_header far *hdr;
  132.     char *value;
  133.     unsigned segment;
  134.     
  135.     if ((value=getenv(TKT_ENV))==NULL) {
  136.         printf("%s : Ticket memory not reserved\n",progname);
  137.         exit(0);
  138.     }
  139.     sscanf(value,"%u",&segment);
  140.     if (segment==0) {
  141.         printf("%s : Environment variable corrupt\n",progname);
  142.         exit(0); 
  143.     }
  144.     hdr=(char far *)((unsigned long)segment<<16|0UL);
  145.     hdr->sema=0;
  146.     printf("%s : Ticket file semaphore reset\n",progname);
  147.     exit(0);
  148. }
  149.  
  150. main(int argc,char **argv)
  151. {
  152.     tkt_header far *hdr;
  153.     char value[12];
  154.     unsigned buffer_size;
  155.     
  156.     progname=argv[0];
  157.  
  158.     if (strchr(argv[1],'?')) {
  159.         printf("Usage : kerbmem [-u] [nnn]\n"
  160.                "-u : Uinstall memory\n"
  161.                "-c : Clear reference count/semaphore\n"
  162.                "nnn : Number of paragraphs to reserve.\n");
  163.         exit(1);
  164.     }
  165.     
  166.     if (!strcmp(argv[1],"-u")) 
  167.         remove_memory();
  168.     
  169.     if (!strcmp(argv[1],"-c")) 
  170.         clear_sema();
  171.     
  172.     if ((buffer_size=atoi(argv[1]))<TKT_FIL_MIN)
  173.         buffer_size=TKT_FIL_SZ;
  174.     
  175.     if (getenv(TKT_ENV)) {
  176.         printf("%s : Kerberos ticket memory already installed\n",progname);
  177.         exit(0);
  178.     }
  179.     sprintf(value,"%u",(unsigned)_psp);
  180.     setvar(TKT_ENV,value);
  181.  
  182.     hdr=(char far *)((unsigned long)_psp<<16|0UL);
  183.     hdr->buf_size=buffer_size*16;        /* size of segment */    
  184.     hdr->eof_ptr=sizeof(tkt_header);    /* pointer to EOF */
  185.     hdr->sema=0;                        /* start with unlocked file */
  186.     printf("%s : Kerberos ticket memory \n"
  187.         "%d paragraphs installed OK\n",progname,buffer_size);
  188.             /* free environment */
  189. #ifdef __BORLANDC__
  190.     freemem(*(unsigned far *)((char far *)hdr+0x2c));    
  191.     keep(0,buffer_size);
  192. #else
  193.     _dos_freemem(*(unsigned far *)((char far *)hdr+0x2c));    
  194.     _dos_keep(0,buffer_size);    
  195. #endif
  196. }
  197.  
  198.